package com.kujie.langchain4j.tool;

import com.kujie.langchain4j.constant.GeoConstant;
import com.kujie.langchain4j.constant.SceneConstant;
import com.kujie.langchain4j.constant.SmartControlConstant;
import com.kujie.langchain4j.domain.query.SceneQuery;
import com.kujie.langchain4j.utils.HttpUtils;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 默认工具
 *
 * @author check
 * @date 2025-07-30
 */
@Slf4j
@Component
public class DefaultTools {
    @Tool("获取空调设备列表")
    public String getAirConditionList() throws Exception {
        log.info("获取空调设备列表工具调用");
        ResponseEntity<String> response = HttpUtils.get(SmartControlConstant.AIR_TOTAL_API_URL, null, null, new ParameterizedTypeReference<String>() {
        });
        return response.getBody();
    }


    @Tool("获取照明/灯光设备列表信息")
    public String getLightingList() throws Exception {
        log.info("获取照明/灯光设备列表工具调用");
        ResponseEntity<String> response = HttpUtils.get(SmartControlConstant.LIGHTING_TOTAL_API_URL, null, null, new ParameterizedTypeReference<String>() {
        });
        return response.getBody();
    }


    @Tool("获取办公室卫生间使用情况，能够获取到卫生间相关信息，无参数输入")
    public String getOfficeToiletUsage() throws Exception {
        log.info("获取办公室卫生间使用情况工具调用");
        ResponseEntity<String> response = HttpUtils.get(SmartControlConstant.OFFICE_TOILET_USAGE_API_URL, null, null, new ParameterizedTypeReference<String>() {
        });
        return response.getBody();
    }

    @Tool("办公室能耗查询，获取办公室能耗，查询各个时间的水费、电费、水耗能、电能耗数据和水电流量数据" +
            "time（时间）：严格按照 YYYY-MM-DD 格式填写" +
            "如果查询日数据，精确到 YYYY-MM-DD" +
            "如果查询月数据，精确到当月第一天 YYYY-MM-01" +
            "如果查询季度数据，精确到季度的第一个月第一天（例如 Q1 为 YYYY-01-01，Q2 为 YYYY-04-01）" +
            "如果查询半年数据，上半年 YYYY-01-01，下半年 YYYY-07-01" +
            " 如果查询年数据，精确到 YYYY-01-01" +
            "timeFlag（时间粒度）：date（日）、week（周）、month（月）、quarter（季度）、halfYear（半年）、year（年）" +
            "dataType 数据类型：1-用电量，2-用水量，3-空调流量" +
            "水能耗单位为吨" +
            "水费单位为元" +
            "电费单位为元" +
            "电耗能单位为千瓦时" +
            "空调费单位为元" +
            "空调流量单位为立方米")
    public String getOfficeConsumeEnergy(@P("时间") String time, @P("时间标识") String timeFlag, @P("数据类型") String dataType) {
        log.info("办公室能耗查询工具调用");
        return HttpUtils.get(SmartControlConstant.OFFICE_ENERGY_API_URL, null, Map.of("time", time, "timeFlag", timeFlag, "dataType", dataType), new ParameterizedTypeReference<String>() {
        }).getBody();
    }

        /**
     * 获取场景列表
     */
    @Tool("获取场景列表，此工具无参数输入")
    public String getSceneList() {
        log.info("获取场景列表工具调用");
        ResponseEntity<String> response = HttpUtils.get(SceneConstant.SCENE_LIST, null, new ParameterizedTypeReference<String>() {
        });
        return response.getBody();
    }


    /**
     * 保存场景
     *
     * @param sceneQuery 场景信息
     * @return 保存结果
     */
    @Tool("保存场景，本方法是用来保存要创建的场景，调用之前先要获取场景列表根据场景名称判断是否已经存在，如果场景已经存在则直接提示用户场景已经存在并且直接结束。如果与灯光/照明有关则调用获取照明/灯光设备列表信息，与空调有关调用获取空调设备列表")
    public String saveScene(@P("创建场景参数") SceneQuery sceneQuery) {
        log.info("创建场景参数工具调用, {}", sceneQuery.toString());
        ResponseEntity<String> response = HttpUtils.post(SceneConstant.SAVE_SCENE, null, sceneQuery, new ParameterizedTypeReference<String>() {
        });
        return response.getBody();
    }

    @Tool("获取天气信息，查询天气，关乎查询天气优先使用这个工具")
    public String getWeather(@P("城市") String city) {
        log.info("获取天气信息工具调用");
        ResponseEntity<String> weather = HttpUtils.get(GeoConstant.WEATHER_URL, null, Map.of("city", city), new ParameterizedTypeReference<String>() {
        });
        return weather.getBody();
    }
}


